﻿package com.main
{
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	// Observer ::
	// implémente le design pattern Observable : permet la mise à jour des données d'affichages (View)
	// à chaque modification effectuée dans le Model
	/////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	public class Observer
	{
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// MEMBRES DE CLASSE
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		private var subscribers:Array;
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// CONSTRUCTEUR
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		function Observer()
		{
			this.subscribers = new Array();
		}
		
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		// METHODES
		/////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public function registerView ( view : Object ) : void
		{
			throw new Error("vous devez surcharger la méthode registerView au sein de votre Model");
		}
		
		// inscrit un nouvel observateur
		protected function addSubscriber(classInstance:Object):Boolean
		{
			for (var i:uint=0; i<this.subscribers.length; i++)
			{
				if (this.subscribers[i] == classInstance)
				{
				return false;
				}
			}
				this.subscribers.push(classInstance);
				return true;
		}
		
		// désinscrit un observateur existant
		protected function removeSubscriber(classInstance:Object):Boolean
		{
			for (var i:uint=0; i<this.subscribers.length; i++)
			{
				if (this.subscribers[i] == classInstance)
				{
					this.subscribers.splice(i,1);
					return true;
				}
			}
			return false;
		}
		
		// déclenche la méthode update() chez les observateurs (View) -> mise à jour de l'affichage
		protected function notifyChanges():void
		{
			for (var i:String in this.subscribers)
			{
				this.subscribers[i].update();
			}
		}
	}
}